const Joi = require('joi');

// 用户创建验证规则
const userCreateSchema = Joi.object({
  username: Joi.string()
    .alphanum()
    .min(3)
    .max(50)
    .required()
    .messages({
      'string.alphanum': '用户名只能包含字母和数字',
      'string.min': '用户名至少需要3个字符',
      'string.max': '用户名最多50个字符',
      'any.required': '用户名是必需的'
    }),
  
  password: Joi.string()
    .min(6)
    .max(100)
    .required()
    .messages({
      'string.min': '密码至少需要6个字符',
      'string.max': '密码最多100个字符',
      'any.required': '密码是必需的'
    }),
  
  real_name: Joi.string()
    .max(100)
    .allow('', null)
    .messages({
      'string.max': '真实姓名最多100个字符'
    }),
  
  phone: Joi.string()
    .pattern(/^1[3-9]\d{9}$/)
    .allow('', null)
    .messages({
      'string.pattern.base': '请输入有效的手机号码'
    }),
  
  role: Joi.string()
    .valid('admin', 'user', 'manager')
    .default('user')
    .messages({
      'any.only': '角色只能是 admin、user 或 manager'
    })
});

// 用户更新验证规则
const userUpdateSchema = Joi.object({
  username: Joi.string()
    .alphanum()
    .min(3)
    .max(50)
    .messages({
      'string.alphanum': '用户名只能包含字母和数字',
      'string.min': '用户名至少需要3个字符',
      'string.max': '用户名最多50个字符'
    }),
  
  password: Joi.string()
    .min(6)
    .max(100)
    .messages({
      'string.min': '密码至少需要6个字符',
      'string.max': '密码最多100个字符'
    }),
  
  real_name: Joi.string()
    .max(100)
    .allow('', null)
    .messages({
      'string.max': '真实姓名最多100个字符'
    }),
  
  phone: Joi.string()
    .pattern(/^1[3-9]\d{9}$/)
    .allow('', null)
    .messages({
      'string.pattern.base': '请输入有效的手机号码'
    }),
  
  role: Joi.string()
    .valid('admin', 'user', 'manager')
    .messages({
      'any.only': '角色只能是 admin、user 或 manager'
    })
}).min(1).messages({
  'object.min': '至少需要提供一个要更新的字段'
});

// 登录验证规则
const loginSchema = Joi.object({
  username: Joi.string()
    .required()
    .messages({
      'any.required': '用户名是必需的'
    }),
  
  password: Joi.string()
    .required()
    .messages({
      'any.required': '密码是必需的'
    })
});

// 分页验证规则
const paginationSchema = Joi.object({
  page: Joi.number()
    .integer()
    .min(1)
    .default(1)
    .messages({
      'number.min': '页码必须大于等于1'
    }),
  
  limit: Joi.number()
    .integer()
    .min(1)
    .max(100)
    .default(10)
    .messages({
      'number.min': '每页数量必须大于等于1',
      'number.max': '每页数量不能超过100'
    }),
  
  username: Joi.string()
    .allow(''),
  
  role: Joi.string()
    .valid('admin', 'user', 'manager')
    .allow('')
});

// 验证用户创建数据
const validateUser = (data) => {
  return userCreateSchema.validate(data, { abortEarly: false });
};

// 验证用户更新数据
const validateUpdateUser = (data) => {
  return userUpdateSchema.validate(data, { abortEarly: false });
};

// 验证登录数据
const validateLogin = (data) => {
  return loginSchema.validate(data, { abortEarly: false });
};

// 验证分页参数
const validatePagination = (data) => {
  return paginationSchema.validate(data, { abortEarly: false });
};

// 验证ID参数
const validateId = (id) => {
  const schema = Joi.number().integer().min(1).required();
  return schema.validate(id);
};

// 验证ID数组
const validateIds = (ids) => {
  const schema = Joi.array()
    .items(Joi.number().integer().min(1))
    .min(1)
    .required()
    .messages({
      'array.min': '至少需要提供一个ID',
      'any.required': 'ID数组是必需的'
    });
  return schema.validate(ids);
};

module.exports = {
  validateUser,
  validateUpdateUser,
  validateLogin,
  validatePagination,
  validateId,
  validateIds
}; 